<?php
/**
 * 文件操作类
 * User: 小菜鸟儿
 * Email: 496651923@qq.com
 */

namespace library;

use app\common\model\File;

class FileOperate
{
	/**
	 *	获取文件信息
	 * @param array $file_ids 文件ID
	 */
	public static function getFileData($file_ids=[],$field='id,save_path',$domain = false) {
		$file=new File();
		$file_ids[]=-1;
		$file_list=$file->getResult(['id'=>['in',$file_ids]],$field);

		$file_data=null;
		foreach ($file_list as $row) {
                        if($domain){
			   $row['save_path']=request()->domain().'/'.$row['save_path'];
                        }
			$file_data[$row['id']]=$row;
		}
		return $file_data;
	}
	/**
	 * 移动文件
	 * @param int $data_id 源文件ID
	 * @param string $target_dir 目标目录
	 */
	public static function moveFile($data_id=0,$target_dir=''){
		$file=new File();
		if($data_id==0) return '源文件不存在';
		$info=$file->getInfo(['id'=>$data_id],'save_path');
		$source_file=$info['save_path'];

		if($source_file!=''){
			$source_file=str_replace("/uploads/","uploads/",$source_file);
		}
		if(!file_exists($source_file)) return '源文件不存在';
		if($target_dir=='') return "请设置目标目录";
		$new_path="uploads/".$target_dir."/".basename($source_file);
		mk_dir("uploads/".$target_dir);
		if($new_path!=$source_file){
			$move_result=rename($source_file,$new_path);
			if($move_result===false){
				return '文件移动失败';
			}
		}
		//更新数据表中的记录
		$data=[
			'save_path'=>$new_path,
			'is_use'=>1
		];
		$result=$file->saveData(['id'=>$data_id],$data);
		if(!is_numeric($result)){
			return $result;
		}
		return true;
	}
	/**
	 * 删除指定目录下的文件夹和文件
	 * @param $path 指定目录路径
	 * @param bool $delDir 是否删除目录本身
	 */
	public static function delDirAndFile($path, $delDir = true):bool
	{
		if (is_array($path)) {
			foreach ($path as $subPath){
				self::delDirAndFile($subPath, $delDir);
			}
		}
		if (is_dir($path)) {
			$handle = opendir($path);
			if ($handle) {
				while (false !== ( $item = readdir($handle) )) {
					if ($item != "." && $item != "..")
						is_dir("$path/$item") ? self::delDirAndFile("$path/$item", $delDir) : unlink("$path/$item");
				}
				closedir($handle);
				if ($delDir)
					clearstatcache();
					return rmdir($path);
			}
		} else {
			if (file_exists($path)) {
				clearstatcache();
				return unlink($path);
			} else {
				clearstatcache();
				return false;
			}
		}
	}
	/**
	 *	删除文件记录
	 * @param array $file_ids 文件ID
	 */
	public static function delFileData($file_ids=[]) {
		$file=new File();
		$file_ids[]=-1;
		$file_list=$file->getResult(['id'=>['in',$file_ids]],'save_path');

		foreach ($file_list as $file_info) {
			if(@unlink($file_info['save_path'])){
				$thumb_files=glob(dirname($file_info['save_path']).'/*'.basename($file_info['save_path']));
				foreach ($thumb_files as $key => $val){
					@unlink($val);
				}
			}
		}
		$file->delData(['id'=>['in',$file_ids]]);
	}
	/**
	 *	删除上传目录里2天前的临时文件夹
	 *  @return                 图片地址
	 */
	public static function delTempDir($path='uploads/temp') {
		if (is_array($path)) {
			foreach ($path as $subPath){
				self::delTempDir($subPath);
			}
		}
		if (is_dir($path)) {
			$handle = opendir($path);
			if ($handle) {
				while (false !== ( $item = readdir($handle) )) {
					if ($item != "." && $item != ".." ) {
						if(is_dir("$path/$item")){
							if($item < date('Ymd',strtotime('-1 day')) && $path=='uploads/temp') {
								self::delTempDir("$path/$item");
							}
						}else{
							unlink("$path/$item");
						}
					}
				}
				closedir($handle);
				if($path!='uploads/temp') {
					return rmdir($path);
				}
			}
		} else {
			if (file_exists($path)) {
				return unlink($path);
			} else {
				return false;
			}
		}
		clearstatcache();
	}
	/**
	 *	删除文件
	 * @param string $path 文件地址
	 */
	public static function delFile($path='') {
		if (file_exists($path)) {
			return unlink($path);
		} else {
			return false;
		}
	}
}